/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: MMutex.h,v 1.1 2009/04/03 12:46:09 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __MMutex__
#define __MMutex__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <Muse.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	
	#define THREAD_SAFE(o)		o->safe( TRUE );
	#define THREAD_AUTO_LOCK	class MLock __auto_lock_##__LINE__(mutex());
	#define THREAD_LOCK(o)		class MLock __lock_##__LINE__(o);	

	//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented thread mutex interface.
	class API MMutex
	{
	public:		
		// constructor
		INLINE MMutex();
		
		// destructor
		INLINE ~MMutex();
		
		// lock the mutex
		// @return 0 if normal, -1 if errno set, errno code otherwise.		
		INLINE I32 lock() const;
		
		// unlock the mutex
		// @return 0 if normal, -1 if errno set, errno code otherwise.
		INLINE I32 unlock() const;
		
	private:
		// implementation-specific private data.
		VOID * mData;
	};

	//////////////////////////////////////////////////////////////////////////

	// the auto lock class
	class API MLock
	{
    public:
        explicit INLINE MLock( const MMutex* m );

        INLINE ~MLock();

	private:
        const MMutex* mMutex;
	};


//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __MMutex__

//////////////////////////////////////////////////////////////////////////